<?php
 /** @package Garennes - Fonctions de gestion des fichiers XML */

 /**
 * Variable globale pour creation structure
 * @global array $table_xml
   [0] = Debut
   [1] = Fin
 */


 /**
 * Fonction de creation d'une structure
 * @param string $version Version du XML
 * @param string $table_caracteres Nom de la table de caracteres utilise
 * @return array Tableau XML
 */
 Function garennes_xml_creation ($version, $table_caracteres)
  {
   $table [0] = "<?xml" ;
   If ($version != "") { $table [0] .= " version=\"".$version."\"" ; }
   If ($table_caracteres != "") { $table [0] .= " encoding=\"".$table_caracteres."\"" ; }
   $table [0] .= " ?>" ;
   $table [1] .= "" ;
   Return $table ;
  }

 /**
 * Fonction de creation d'un noeud
 * @param string $nom Nom du noeud
 * @param array $attributs Table des attributs
 *                         [0][0]=Nombre
 *                         [i][0]=Nom
 *                         [i][1]=Valeur
 * @param array $noeuds Table des noeuds contenus
 *                         [0][0]=Nombre
 *                         [i][0]=Debut
 *                         [i][1]=Fin
 * @param string $noeuds Chaine de caracteres, valeur du noeud
 * @return array tableau XML
 */
 Function garennes_xml_noeud ($nom, $attributs, $noeuds)
  {
   $table [0] = "<".$nom ;
   If ($attributs [0][0] > 0)
    {
     For ($i = 1 ; $i <= $attributs [0][1] ; $i++)
      {
       $table [0] .= " ".$attributs [$i][0]."=\"".$attributs [$i][1]."\"" ;
      }
    }
   If (Is_Array ($noeuds))
    {
     If ($noeuds [0][0] > 0)
      {
       $table [0] .= ">" ;
       For ($i = 1 ; $i <= $noeuds [0][0] ; $i++)
        {
         $table [0] .= $noeuds [$i][0] ;
         $table [1] = $noeuds [$i][1].$table [1] ;
        }
      }
     Else { $table [0] .= "/>" ; }
     $table [1] = "" ;
    }
   Else
    {
     If ($noeuds != "") { $table [0] .= ">".$noeuds."</".$nom.">" ; }
     Else { $table [1] = "</".$nom.">" ; }
    }
   Return $table ;
  }

 /*
 * Generation du fichier XML pour exportation APB pour un etablissement
 * @param string $garennes_version Version du logiciel
 * @param array $etablissement Caracteristiques etablissement
 * @param array $classes Caracteristiques des classes
 * @param array $notes Caracteristiques des notes
 * @param array $matieres Caracteristiques des matieres
 * @param array $eleves Caracteristiques des eleves
 * @return string XML genere
 */
 Function garennes_generation_apb ($garennes_version, $etablissement, $classes, $notes, $matieres, $enseignants, $eleves)
  {
   $xml = New DOMDocument ('1.0','iso-8859-15') ;

   // ----------------------------------------------------------------------------
   // Racine : Fichier
   $racine = $xml->createElement ('fichier') ;
   $xml->appendChild ($racine) ;

   $racine_logiciel = $xml->createAttribute ('logiciel') ;
   $racine_version = $xml->createAttribute ('version') ;
   $racine_date_creation = $xml->createAttribute ('date-creation') ;
   $racine->appendChild ($racine_logiciel) ;
   $racine->appendChild ($racine_version) ;
   $racine->appendChild ($racine_date_creation) ;

   $racine_logiciel_valeur = $xml->createTextNode ('garennes') ;
   $racine_version_valeur = $xml->createTextNode ($garennes_version) ;
   $racine_date_valeur = $xml->createTextNode (StrFTime ("%Y-%m-%d")) ;

   $racine_logiciel->appendChild ($racine_logiciel_valeur) ;
   $racine_version->appendChild ($racine_version_valeur) ;
   $racine_date_creation->appendChild ($racine_date_valeur) ;

   // ----------------------------------------------------------------------------
   // Etablissement
   $noeud_etablissement = $xml->createElement ('etablissement') ;
   $racine->appendChild ($noeud_etablissement) ;

   $etab_rne = $xml->createAttribute ('rne') ;
   $etab_nom = $xml->createAttribute ('nom') ;
   $etab_cp = $xml->createAttribute ('cp') ;
   $noeud_etablissement->appendChild ($etab_rne) ;
   $noeud_etablissement->appendChild ($etab_nom) ;
   $noeud_etablissement->appendChild ($etab_cp) ; 
   $etab_rne_valeur = $xml->createTextNode ($etablissement ['rne']) ;
   $etab_nom_valeur = $xml->createTextNode ($etablissement ['nom']) ;
   $etab_cp_valeur = $xml->createTextNode ($etablissement ['cp']) ;
   $etab_rne->appendChild ($etab_rne_valeur) ;
   $etab_cp->appendChild ($etab_cp_valeur) ;
   $etab_nom->appendChild ($etab_nom_valeur) ;

   // ----------------------------------------------------------------------------
   // Classes
   $noeud_classes = $xml->createElement ('classes') ;
   $noeud_etablissement->appendChild ($noeud_classes) ;

   ForEach ($classes as $cl)
    {
     $classe_courante = $xml->createElement ('classe') ;
     $noeud_classes->appendChild ($classe_courante) ;

     $cl_code = $xml->createAttribute ('code') ;
     $cl_code_valeur = $xml->createTextNode (PReg_Replace ('/ /', '', 'C-'.UTF8_Encode ($cl ['code']))) ;
     $classe_courante->appendChild ($cl_code) ;
     $cl_code->appendChild ($cl_code_valeur) ;

     $cl_annee = $xml->createAttribute ('annee') ;
     $cl_annee_valeur = $xml->createTextNode ($cl ['annee']) ;
     $classe_courante->appendChild ($cl_annee) ;
     $cl_annee->appendChild ($cl_annee_valeur) ;

     $cl_nom = $xml->createAttribute ('nom') ;
     $cl_nom_valeur = $xml->createTextNode (UTF8_Encode ($cl ['nom'])) ;
     $classe_courante->appendChild ($cl_nom) ;
     $cl_nom->appendChild ($cl_nom_valeur) ;

     $cl_niveau = $xml->createAttribute ('niveau') ;
     $cl_niveau_valeur = $xml->createTextNode (UTF8_Encode ($cl ['niveau'])) ;
     $classe_courante->appendChild ($cl_niveau) ;
     $cl_niveau->appendChild ($cl_niveau_valeur) ;

     // Inserer les profs principaux
     If ($cl ['prof_princ'] != "")
      {
       $cl_prof_princ = $xml->createAttribute ('professeur-principal') ;
       $cl_prof_princ_valeur = $xml->createTextNode ($cl ['prof_princ']) ;
       $classe_courante->appendChild ($cl_prof_princ) ;
       $cl_decoupage->appendChild ($cl_prof_princ_valeur) ;
      }

     $cl_decoupage = $xml->createAttribute ('decoupage') ;
     $cl_decoupage_valeur = $xml->createTextNode ($cl ['decoupage']) ;
     $classe_courante->appendChild ($cl_decoupage) ;
     $cl_decoupage->appendChild ($cl_decoupage_valeur) ;
    }

   // ----------------------------------------------------------------------------
   // Services notations
   $services_notations = $xml->createElement ('services-notations') ;
   $noeud_etablissement->appendChild ($services_notations) ;

   ForEach ($notes as $code => $sn)
    {
     // Note : csn pour current_service_notation
     $csn = $xml->createElement ('service-notation') ;
     $services_notations->appendChild ($csn) ;

     // On passe les attributs
     $snCode = $xml->createAttribute ('code') ;
     $snCode_valeur = $xml->createTextNode ('S-'.UTF8_Encode ($code)) ;
     $csn->appendChild ($snCode) ;
     $snCode->appendChild ($snCode_valeur) ;

     $snAnnee = $xml->createAttribute ('annee') ;
     $snAnnee_valeur = $xml->createTextNode (UTF8_Encode ($sn ['annee'])) ;
     $csn->appendChild ($snAnnee) ;
     $snAnnee->appendChild ($snAnnee_valeur) ;

     $snTrimestre = $xml->createAttribute ('trimestre') ;
     $snTrimestre_valeur = $xml->createTextNode (UTF8_Encode ($sn ['trimestre'])) ;
     $csn->appendChild ($snTrimestre) ;
     $snTrimestre->appendChild ($snTrimestre_valeur) ;

     $snCodeEnseignant = $xml->createAttribute ('code-enseignant') ;
     $snCodeEnseignant_valeur = $xml->createTextNode ('P-'.UTF8_Encode ($sn ['code-enseignant'])) ;
     $csn->appendChild ($snCodeEnseignant) ;
     $snCodeEnseignant->appendChild ($snCodeEnseignant_valeur) ;

     $snCodeMatiere = $xml->createAttribute ('code-matiere') ;
     $snCodeMatiere_valeur = $xml->createTextNode ('M-'.UTF8_Encode ($sn ['code-matiere'])) ;
     $csn->appendChild ($snCodeMatiere) ;
     $snCodeMatiere->appendChild ($snCodeMatiere_valeur) ;

     // Effectif
     If ($sn ['effectif'] != '0')
      {
       $effectif = $xml->createElement ('effectif') ;
       $csn->appendChild ($effectif) ;
       $effectif_valeur = $xml->createTextNode ($sn ['effectif']) ;
       $effectif->appendChild ($effectif_valeur) ;
      }
     // Moyenne classe
     If ($sn ['moyenne-classe'] != '')
      {
       $moyenne_classe = $xml->createElement ('moyenne-classe') ;
       $csn->appendChild ($moyenne_classe) ;
       $moyenne_classe_valeur = $xml->createTextNode ($sn ['moyenne-classe']) ;
       $moyenne_classe->appendChild ($moyenne_classe_valeur) ;
      }
     // Moyenne haute
     If ($sn ['moyenne-haute'] != '')
      {
       $moyenne_haute = $xml->createElement ('moyenne-haute') ;
       $csn->appendChild ($moyenne_haute) ;
       $moyenne_haute_valeur = $xml->createTextNode ($sn ['moyenne-haute']) ;
       $moyenne_haute->appendChild ($moyenne_haute_valeur) ;
      }
     // Moyenne basse
     If ($sn ['moyenne-basse'] != '')
      {
       $moyenne_basse = $xml->createElement ('moyenne-basse') ;
       $csn->appendChild ($moyenne_basse) ;
       $moyenne_basse_valeur = $xml->createTextNode ($sn ['moyenne-basse']) ;
       $moyenne_basse->appendChild ($moyenne_basse_valeur) ;
      }
    }

   // ----------------------------------------------------------------------------
   // Les matieres
   $noeud_matieres = $xml->createElement ('matieres') ;
   $noeud_etablissement->appendChild ($noeud_matieres) ;

   ForEach ($matieres as $matiere)
    {
     $mat = $xml->createElement ('matiere') ;
     $noeud_matieres->appendChild ($mat) ;

     // On passe les attributs
     $matCode = $xml->createAttribute ('code') ;
     $matCode_valeur = $xml->createTextNode ('M-'.UTF8_Encode ($matiere ['code'])) ;
     $mat->appendChild ($matCode) ;
     $matCode->appendChild ($matCode_valeur) ;

     $matCodeSconet = $xml->createAttribute ('code-sconet') ;
     $matCodeSconet_valeur = $xml->createTextNode (UTF8_Encode ($matiere ['code'])) ;
     $mat->appendChild ($matCodeSconet) ;
     $matCodeSconet->appendChild ($matCodeSconet_valeur) ;

     $matLibelle = $xml->createAttribute ('libelle') ;
     $matLibelle_valeur = $xml->createTextNode (UTF8_Encode ($matiere ['libelle'])) ;
     $mat->appendChild ($matLibelle) ;
     $matLibelle->appendChild ($matLibelle_valeur) ;
    }

   // ----------------------------------------------------------------------------
   // LANGUES VIVANTES : il va faut trouver un moyen de les caracteriser...
   // Ca risque de devoir passer par une configuration manuelle, soit au moment
   // de l'export, soit dans la configuration du module.
   // Pour l'instant, on exporte une langue vivante vide et non utilisee, pour
   // etre conforme au schema...
   $noeud_langues = $xml->createElement ('langues-vivantes') ;
   $noeud_etablissement->appendChild ($noeud_langues) ;

   $lv1 = $xml->createElement ('langue-vivante') ;
   $noeud_langues->appendChild ($lv1) ;
   $lv1Code = $xml->createAttribute ('code') ;
   $lv1Code_valeur = $xml->createTextNode ('LV-LV1-TEST') ;
   $lv1Libelle = $xml->createAttribute ('libelle') ;
   $lv1Libelle_valeur = $xml->createTextNode ('LV1 de Test') ;
   $lv1->appendChild ($lv1Code) ;
   $lv1Code->appendChild ($lv1Code_valeur) ;
   $lv1->appendChild ($lv1Libelle) ;
   $lv1Libelle->appendChild ($lv1Libelle_valeur) ;

   // ----------------------------------------------------------------------------
   // Les enseignants
   $noeud_enseignants = $xml->createElement ('enseignants') ;
   $noeud_etablissement->appendChild ($noeud_enseignants) ;

   ForEach ($enseignants as $prof)
    {
     $e = $xml->createElement ('enseignant') ;
     $noeud_enseignants->appendChild ($e) ;

     // On passe les attributs
     $eCode = $xml->createAttribute ('code') ;
     $eCode_valeur = $xml->createTextNode ('P-'.UTF8_Encode ($prof ['code'])) ;
     $e->appendChild ($eCode) ;
     $eCode->appendChild ($eCode_valeur) ;

     $eNom = $xml->createAttribute ('nom') ;
     $eNom_valeur = $xml->createTextNode (UTF8_Encode ($prof ['nom'])) ;
     $e->appendChild ($eNom) ;
     $eNom->appendChild ($eNom_valeur) ;

     $ePrenom = $xml->createAttribute ('prenom') ;
     $ePrenom_valeur = $xml->createTextNode (UTF8_Encode ($prof ['prenom'])) ;
     $e->appendChild ($ePrenom) ;
     $ePrenom->appendChild ($ePrenom_valeur) ;
    }

   // ----------------------------------------------------------------------------
   // Les eleves
   $noeud_eleves = $xml->createElement ('eleves') ;
   $noeud_etablissement->appendChild ($noeud_eleves) ;

   ForEach ($eleves as $el)
    {
     $e = $xml->createElement ('eleve') ;
     $noeud_eleves->appendChild ($e) ;

     // On passe les attributs
     $eCode = $xml->createAttribute ('code') ;
     $eCode_valeur = $xml->createTextNode ('E-'.UTF8_Encode ($el ['code'])) ;
     $e->appendChild ($eCode) ;
     $eCode->appendChild ($eCode_valeur) ;

     $eINE = $xml->createAttribute ('ine') ;
     $eINE_valeur = $xml->createTextNode (UTF8_Encode ($el ['ine'])) ;
     $e->appendChild ($eINE) ;
     $eINE->appendChild ($eINE_valeur) ;

     $eNom = $xml->createAttribute ('nom') ;
     $eNom_valeur = $xml->createTextNode (UTF8_Encode ($el ['nom'])) ;
     $e->appendChild ($eNom) ;
     $eNom->appendChild ($eNom_valeur) ;

     $ePrenom = $xml->createAttribute ('prenom') ;
     $ePrenom_valeur = $xml->createTextNode (UTF8_Encode ($el ['prenom'])) ;
     $e->appendChild ($ePrenom) ;
     $ePrenom->appendChild ($ePrenom_valeur) ;

     $eNaissance = $xml->createAttribute ('date-naissance') ;
     $eNaissance_valeur = $xml->createTextNode (UTF8_Encode ($el ['date-naissance'])) ;
     $e->appendChild ($eNaissance) ;
     $eNaissance->appendChild ($eNaissance_valeur) ;

     // On passe les annees scolaires
     $annees_scolaires = $xml->createElement ('annees-scolaires') ;
     $e->appendChild ($annees_scolaires) ;

     ForEach ($el ['annees-scolaires'] as $an)
      {
       $annee = $xml->createElement ('annee-scolaire') ;
       $annees_scolaires->appendChild ($annee) ;

       $anneeDescription = $xml->createAttribute ('annee') ;
       $anneeDescription_valeur = $xml->createTextNode (UTF8_Encode ($an ['annee'])) ;
       $annee->appendChild ($anneeDescription) ;
       $anneeDescription->appendChild ($anneeDescription_valeur) ;

       $anneeCodeClasse = $xml->createAttribute ('code-classe') ;
       $anneeCodeClasse_valeur = $xml->createTextNode (PReg_Replace ('/ /', '', 'C-'.UTF8_Encode ($an ['code-classe']))) ;
       $annee->appendChild ($anneeCodeClasse) ;
       $anneeCodeClasse->appendChild ($anneeCodeClasse_valeur) ;

       // Les bulletins pour l'annee consideree
       $bulletins = $xml->createElement ('bulletins') ;
       $annee->appendChild ($bulletins) ;

       ForEach ($an ['bulletins'] as $bulletin)
        {
         $b = $xml->createElement ('bulletin') ;
         $bulletins->appendChild ($b) ;

         $bTrimestre = $xml->createAttribute ('trimestre') ;
         $bTrimestre_valeur = $xml->createTextNode (UTF8_Encode ($bulletin ['trimestre'])) ;
         $b->appendChild ($bTrimestre) ;
         $bTrimestre->appendChild ($bTrimestre_valeur) ;

         // Les notes pour ce trimestre
         ForEach ($bulletin ['notes'] as $note)
          {
           $n = $xml->createElement ('notes') ;
           $b->appendChild ($n) ;

           $nServiceNotation = $xml->createAttribute ('code-service-notation') ;
           $nServiceNotation_valeur = $xml->createTextNode ('S-'.UTF8_Encode ($note ['code-service-notation'])) ;
           $n->appendChild ($nServiceNotation) ;
           $nServiceNotation->appendChild ($nServiceNotation_valeur) ;

           // Etat de la note
           $nEtat = $xml->createAttribute ('etat') ;
           $nEtat_valeur = $xml->createTextNode (UTF8_Encode ($note ['etat'])) ;
           $n->appendChild ($nEtat) ;
           $nEtat->appendChild ($nEtat_valeur) ;

           If ($note ['etat'] == 'S')
            {
             $nMoyenne = $xml->createElement ('moyenne') ;
             $nMoyenne_valeur = $xml->createTextNode (UTF8_Encode ($note ['moyenne'])) ;
             $n->appendChild ($nMoyenne) ;
             $nMoyenne->appendChild ($nMoyenne_valeur) ;

             $nRang = $xml->createElement ('rang') ;
             $nRang_valeur = $xml->createTextNode (UTF8_Encode ($note ['rang'])) ;
             $n->appendChild ($nRang) ;
             $nRang->appendChild ($nRang_valeur) ;
            }

           If ($note ['coefficient'] != '0.0')
            {
             $nCoefficient = $xml->createElement ('coefficient') ;
             $nCoefficient_valeur = $xml->createTextNode (UTF8_Encode ($note ['coefficient'])) ;
             $n->appendChild ($nCoefficient) ;
             $nCoefficient->appendChild ($nCoefficient_valeur) ;
            }
           $nAppreciation = $xml->createElement ('appreciation') ;
           $nAppreciation_valeur = $xml->createTextNode (UTF8_Encode ($note ['appreciation'])) ;
           $n->appendChild ($nAppreciation) ;
           $nAppreciation->appendChild ($nAppreciation_valeur) ;
          }
        }
      }
    }
   Return $xml->saveXML () ;
  }

 /*
 * ===================== GENERATION APB XML  =====================
 */
 /**
 * Recherche d'un element dans un tableau a une dimension
 * @param string $chaine Chaine a rechercher
 * @param array $table Tableau 1 dimension [0]=Nombre;[i]=element
 * @return int Position chaine si existe sinon 0
 */
 Function dans_table ($chaine, $table)
  {
   $ok = 0 ;
   $i = 1 ;
   While (($i <= $table [0]) And ($ok == 0))
    {
     If ($table [$i] == $chaine) { $ok = $i ; }
     $i++ ;
    }
   Return $ok ;
  }

 /**
 * Recherche d'un element dans un tableau a deux dimensions
 * @param string $chaine1 Chaine a rechercher
 * @param string $chaine2 Chaine a rechercher
 * @param array $table Tableau 2 dimensions [0][0]=Nombre;[i][0]=element1;[i][1]=element2
 * @return int Indique le numero de la table ou 0 si n'existe pas
 */
 Function dans_table_double ($chaine1, $chaine2, $table)
  {
   $ok = 0 ;
   $i = 1 ;
   While (($i <= $table [0][0]) And ($ok == 0))
    {
     If (($table [$i][0] == $chaine1) And ($table [$i][1] == $chaine2)) { $ok = $i ; }
     $i++ ;
    }
   Return $ok ;
  }

 /**
 * Procedure principale de generation XML pour APB
 * @param int $id_etablissement Identifiant de l'etablissement
 * @param array $classes Table des classes [0]=Nombre, [i]=identifiant classe
 * @param int $numero_export Numero d'exportation (1 ou 2)
 * @return string Exportation directe avec entetes HTTP
 */
 Function garennes_apb_generation_xml ($id_etablissement, $classes, $numero_export)
  {
   Global $id_sql, $code_absent, $code_dispense, $code_non_rendu, $code_aucune_note, $code_pas_discipline, $note_par_defaut ;

   @Set_Time_Limit (0) ;

   $millesime = millesime (0) ;
   $nombre_colonnes_appreciations = restaure_configuration ("SYSTEME_PARAM", "SAISIE_MULTIPLE_".$id_etablissement, "NBR_COLONNES") ;
   $ligne = "\n" ;

   // Recherche etablissement
   $etab = SQL_commande ("SELECT numero,nom,cp FROM etablissements WHERE id_etablissement='".$id_etablissement."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($etab) == 1) { $e = SQL_ligne_suivante ($etab) ; } Else { $e [0] = $e [1] = $e [2] = "" ; }
   $table_etablissement ["rne"] = $e [0] ;
   $table_etablissement ["nom"] = UTF8_Encode ($e [1]) ;
   $table_etablissement ["cp"] = $e [2] ;

   // Parcours les classes
   $requete  = "SELECT c.id_classe,c.nom,n.apb_nom,c.id_prof_princ,p.nombre,c.num_periode,c.millesime FROM classes c,types_periode p,types_niveaux n " ;
   $requete .= "WHERE p.id_type_periode=c.periode AND c.id_type_niveau=n.id_type_niveau AND (" ;
   For ($i = 1 ; $i <= $classes [0] ; $i++)
    {
     If ($i > 1) { $requete .= " OR " ; }
     $requete .= "c.id_classe='".$classes [$i]."'" ;
    }
   $requete .= ")" ;
   $rep_classes = SQL_commande ($requete, $id_sql) ;
   $table_classes [0][0] = $classes [0] ;
   $codes_classes [0] = 0 ;
   For ($i = 1 ; $i <= $classes [0] ; $i++)
    {
     $cl = SQL_ligne_suivante ($rep_classes) ;
     $table_classes [$i]["id_classe"] = $cl [0] ;
     $table_classes [$i]["code_classe"] = APB_ENTETE_CLASSE.$cl [6]."-".$table_classes [$i]["id_classe"] ;
     $table_classes [$i]["classe"] = $cl [6]."-".$table_classes [$i]["id_classe"] ;
     $table_classes [$i]["annee"] = $cl [6]+1 ; // +1 ?????????
     $table_classes [$i]["nom"] = UTF8_Encode ($cl [1]) ;
     $table_classes [$i]["niveau"] = $cl [2] ;
     $table_classes [$i]["code_prof_princ"] = APB_ENTETE_PROF.$cl [6]."-".$cl [3] ;
     $table_classes [$i]["decoupage"] = $cl [4] ;
     $codes_classes [0]++ ;
     $codes_classes [$codes_classes [0]] = $table_classes [$i]["code_classe"] ;
    }
   // Recherche de la liste des eleves des classes
   $requete  = "SELECT e.id_eleve,e.repere2,e.nom,e.prenoms,e.date_naissance,e.millesime,m.code,s.libelle_court,e.classe FROM eleves e,mefs m,mefstats4 s WHERE (" ;
   For ($i = 1 ; $i <= $table_classes [0][0] ; $i++)
    {
     If ($i > 1) { $requete .= " OR " ; }
     $requete .= "e.classe='".$table_classes [$i]["id_classe"]."'" ;
    }
   $requete .= ") AND e.mef=m.code AND m.mefstat4=s.code ORDER BY e.classe,e.nom,e.prenoms" ;
   $liste_eleves = SQL_commande ($requete, $id_sql) ;
   $table_eleves [0][0] = SQL_nbr_lignes ($liste_eleves) ;
   UnSet ($mef_eleve) ;
   For ($i = 1 ; $i <= $table_eleves [0][0] ; $i++)
    {
     $eleve = SQL_ligne_suivante ($liste_eleves) ;
     $table_eleves [$i]["eleve"]["id_eleve"] = $eleve [0] ;
     $table_eleves [$i]["eleve"]["ine"] = $eleve [1] ;
     $table_eleves [$i]["eleve"]["code"] = APB_ENTETE_ELEVE.$table_eleves [$i]["eleve"]["ine"] ;
     $table_eleves [$i]["eleve"]["nom"] = $eleve [2] ;
     $table_eleves [$i]["eleve"]["prenom"] = $eleve [3] ;
     $table_eleves [$i]["eleve"]["date_naissance"] = $eleve [4] ;
     $table_eleves [$i]["eleve"]["annees_scolaires"] = 1 ; // Nombre de classes
     $table_eleves [$i]["annee_scolaire_1"]["annee"] = $eleve [5]+1 ; // +1 ?????????
     $table_eleves [$i]["annee_scolaire_1"]["code_classe"] = APB_ENTETE_CLASSE.$eleve [5]."-".$eleve [8] ;
     $table_eleves [$i]["annee_scolaire_1"]["classe"] = $eleve [5]."-".$eleve [8] ;
     $table_eleves [$i]["annee_scolaire_1"]["id_classe"] = $eleve [8] ;
     $table_eleves [$i]["annee_scolaire_1"]["code_mef"] = $eleve [6] ;
     $table_eleves [$i]["annee_scolaire_1"]["libelle_mef"] = $eleve [7] ;
     $table_eleves [$i]["annee_scolaire_1"]["id_apb_eleve"] = 0 ;
     $mef_eleve [$eleve [0]] = $eleve [6] ;
    }
   // Recherche des classes en archive pour chaque eleve
   $niveaux = Explode ("|", APB_NIVEAUX_EXPORT) ;
   $requete_niveaux = "" ;
   For ($j = 0 ; $j < SizeOf ($niveaux) ; $j++)
    {
     If ($j > 0) { $requete_niveaux .= " OR " ; }
     $requete_niveaux .= "apb_nom='".$niveaux [$i]."'" ;
    }
   For ($i = 1 ; $i <= $table_eleves [0][0] ; $i++)
    {
     $requete  = "SELECT c.code,c.nom,c.niveau,c.professeur_principal,c.decoupage,c.annee,a.code_mef,a.libelle_mef,e.id_apb_eleve,c.id_apb_classe " ;
     $requete .= "FROM apb_eleves e,apb_annee_scolaire a,apb_classes c,apb_etablissements t,types_niveaux n " ;
     $requete .= "WHERE e.ine=\"".$table_eleves [$i]["eleve"]["ine"]."\" AND e.id_apb_eleve=a.id_apb_eleve AND a.id_apb_classe=c.id_apb_classe " ;
     $requete .= "AND c.id_apb_etablissement=t.id_apb_etablissement AND t.rne=\"".$table_etablissement ["rne"]."\" AND (".$requete_niveaux.") " ;
     $requete .= "AND c.niveau=n.id_type_niveau" ;
     $rep_classes = SQL_commande ($requete, $id_sql) ;
     $nbr = SQL_nbr_lignes ($rep_classes) ;
     For ($j = 0 ; $j < $nbr ; $j++)
      {
       $cl = SQL_ligne_suivante ($rep_classes) ;
       If (!dans_table ($cl [0], $codes_classes))
        {
         $codes_classes [0]++ ;
         $codes_classes [$codes_classes [0]] = $cl [0] ;

         $table_classes [0][0]++ ;
         $table_classes [$table_classes [0][0]]["id_classe"] = -$cl [9] ;
         $table_classes [$table_classes [0][0]]["code_classe"] = $cl [0] ;
         $table_classes [$table_classes [0][0]]["classe"] = SubStr (1, StrLen ($cl [0])-1, $cl [0]) ;
         $table_classes [$table_classes [0][0]]["annee"] = $cl [5]+1 ; // +1 ?????????
         $table_classes [$table_classes [0][0]]["nom"] = UTF8_Encode ($cl [1]) ;
         $table_classes [$table_classes [0][0]]["niveau"] = $cl [2] ;
         $table_classes [$table_classes [0][0]]["code_prof_princ"] = $cl [3] ;
         $table_classes [$table_classes [0][0]]["decoupage"] = $cl [4] ;

         $table_eleves [$i]["eleve"]["annees_scolaires"]++ ; // Nombre de classes
         $table_eleves [$i]["annee_scolaire_".$table_eleves [$i]["eleve"]["annees_scolaires"]]["annee"] = $cl [5]+1 ; // +1 ?????????
         $table_eleves [$i]["annee_scolaire_".$table_eleves [$i]["eleve"]["annees_scolaires"]]["code_classe"] = $table_classes [$table_classes [0][0]]["code_classe"] ;
         $table_eleves [$i]["annee_scolaire_".$table_eleves [$i]["eleve"]["annees_scolaires"]]["classe"] = $table_classes [$table_classes [0][0]]["classe"] ;
         $table_eleves [$i]["annee_scolaire_".$table_eleves [$i]["eleve"]["annees_scolaires"]]["id_classe"] = $table_classes [$table_classes [0][0]]["id_classe"] ;
         $table_eleves [$i]["annee_scolaire_".$table_eleves [$i]["eleve"]["annees_scolaires"]]["code_mef"] = $cl [6] ;
         $table_eleves [$i]["annee_scolaire_".$table_eleves [$i]["eleve"]["annees_scolaires"]]["libelle_mef"] = $cl [7] ;
         $table_eleves [$i]["annee_scolaire_".$table_eleves [$i]["eleve"]["annees_scolaires"]]["id_apb_eleve"] = $cl [8] ;
        }
      }
    }

   /* ===============================================================================================================================
   // Structure pedagogique de la classe
   $table_enseignants [0][0] = $codes_enseignants [0] = 0 ;
   $table_matieres [0][0] = $codes_matieres [0] = 0 ;
   $table_service_notation [0][0] = $code_service_notation [0] = 0 ;
   $table_disc [0][0] = 0 ;
   UnSet ($nombre_services) ;
   For ($num_classe = 1 ; $num_classe <= $table_classes [0][0] ; $num_classe++)
    {
     $id_classe = $table_classes [$num_classe]["id_classe"] ;
     If ($id_classe > 0)
      {
       // Structure actuelle
       $structure = structure_pedagogique ($id_classe, -2, $millesime) ;
       $nombre_services [$id_classe] = SQL_nbr_lignes ($structure) ;
       For ($num_disc = 1 ; $num_disc <= $nombre_services [$id_classe] ; $num_disc++)
        {
         $discipline = SQL_ligne_suivante ($structure) ;

         // Enregistrement enseignant
         $prof = caracteristiques_utilisateur ($discipline [11]) ;
         $code_enseignant = APB_ENTETE_PROF.$millesime."-".$prof [0] ;
         If (!dans_table ($code_enseignant, $codes_enseignants))
          {
           $codes_enseignants [0]++ ;
           $codes_enseignants [$codes_enseignants [0]] = $code_enseignant ;

           $table_enseignants [0][0]++ ;
           $table_enseignants [$table_enseignants [0][0]]["code"] = $code_enseignant ;
           $table_enseignants [$table_enseignants [0][0]]["nom"] = $prof [2] ;
           $table_enseignants [$table_enseignants [0][0]]["prenom"] = $prof [3] ;
          }

         // Enregistrement matiere
         $code_matiere = APB_ENTETE_MATIERE.$millesime."-".$discipline [0] ;
         If ($discipline [14] != 0) { $nom_groupe = nom_groupe_parid ($discipline [14]) ; } Else { $nom_groupe = "" ; }

         If (!Array_Key_Exists ($discipline [4], $codes_matieres))
          {
           $codes_matieres [0]++ ;
           $codes_matieres [$discipline [4]] = $code_matiere ;

           $table_matieres [0][0]++ ;
           $table_matieres [$table_matieres [0][0]]["code"] = $code_matiere ;
           $table_matieres [$table_matieres [0][0]]["libelle_sconet"] = $discipline [1] ;
           $table_matieres [$table_matieres [0][0]]["libelle"] = $discipline [1] ;
           $table_matieres [$table_matieres [0][0]]["code_sconet"] = $discipline [4] ;
           // Matiere specialitee
           //If (($discipline [16] > 0) And (sous_discipline_specialite ($discipline [16]) == 1)) { $matiere_specialite = "true" ; }
           //Else { $matiere_specialite = "false" ; }
           //$table_matieres [$table_matieres [0][0]]["specialite"] = $matiere_specialite ;
           // Nom du Groupe
           $table_matieres [$table_matieres [0][0]]["nom_groupe"] = $nom_groupe ;
           // Id structure sconet (====A FAIRE====)
           $table_matieres [$table_matieres [0][0]]["id_structure_sconet"] = "" ;
          }
         Else { $code_matiere = $codes_matieres [$discipline [4]] ; }

         // Discipline dans la classe ?
         $fusion_ok = dans_table_double ($id_classe, $discipline [4], $table_disc) ;
         If ($fusion_ok == 0)
          {
           $table_disc [0][0]++ ;
           $table_disc [$table_disc [0][0]][0] = $id_classe ;
           $table_disc [$table_disc [0][0]][1] = $discipline [4] ;
           $table_disc [$table_disc [0][0]][2] = $num_disc ;
          }
         Else
          {
           //$fusion_ok = 1 ;
          }
         //echo "(".$fusion_ok.")".$id_classe."->id_disc=".$discipline [0].";code=".$discipline [4].";num=".$num_disc."<br>" ;

         // Service notation
         // Determine les moyennes
         //$nbr_periodes = periode_valide ($id_classe) ;
         Switch ($numero_export)
          {
           Default :
            Case 1 : $num_periode_debut = 1 ;
                     $num_periode_fin = 1 ;
                     Break ;
            Case 2 : $num_periode_debut = 2 ;
                     $num_periode_fin = 2 ;
                     Break ;
          }
         For ($num_periode = $num_periode_debut ; $num_periode <= $num_periode_fin ; $num_periode++)
          {
           $code_sn = APB_ENTETE_SERVICE_NOTATION.$millesime."-".$id_classe."-".$discipline [0]."-".$num_periode ;

           If ($fusion_ok == 0)
            {
             $table_disc [$table_disc [0][0]][3] = $code_sn ;
             If (!dans_table ($code_sn, $code_service_notation))
              {
               $code_service_notation [0]++ ;
               $code_service_notation [$code_service_notation [0]] = $code_sn ;

               $table_service_notation [0][0]++ ;
               $table_service_notation [$table_service_notation [0][0]]["code"] = $code_sn ;
               $table_service_notation [$table_service_notation [0][0]]["annee"] = $millesime+1 ; // +1 ?????????
               $table_service_notation [$table_service_notation [0][0]]["trimestre"] = $num_periode ;
               $table_service_notation [$table_service_notation [0][0]]["code_enseignant"] = $code_enseignant ;
               $table_service_notation [$table_service_notation [0][0]]["code_matiere"] = $code_matiere ;
               $table_service_notation [$table_service_notation [0][0]]["nom_groupe"] = $nom_groupe ;
               $table_service_notation [$table_service_notation [0][0]]["id_structure_sconet"] = "" ;

               $moy_classe = stats_disc ($id_classe, $discipline [0], $num_periode, $discipline [9], $discipline [13], $millesime) ;
               $table_service_notation [$table_service_notation [0][0]]["moyenne_classe"] = $moy_classe ["moy"] ;
               $table_service_notation [$table_service_notation [0][0]]["moyenne_haute"] = $moy_classe ["max"] ;
               $table_service_notation [$table_service_notation [0][0]]["moyenne_basse"] = $moy_classe ["min"] ;
               $table_service_notation [$table_service_notation [0][0]]["effectif"] = effectif ($id_classe) ;
              }
            }
           Else { $code_sn = $table_disc [$fusion_ok][3] ; }
           //echo "  code-sn=".$code_sn."<br>" ;

           // Traitement des notes/appreciations par classe
           $notes_app = caracteristiques_discipline ($id_classe, $num_periode, $discipline [0], $discipline [13], $discipline [9], $discipline [11], $nombre_colonnes_appreciations, $millesime) ;
           // Fusion des appreciations multi-colonnes
           If ($fusion_ok > 0) { $num_disc_tempo = $table_disc [$fusion_ok][2] ; $chaine_defaut = $discipline [2].":" ; }
           Else
            {
             $num_disc_tempo = $num_disc ;
             $chaine_defaut = "" ;
             For ($num_eleve = 1 ; $num_eleve <= $notes_app [0][0] ; $num_eleve++)
              {
               $bulletin [$notes_app [$num_eleve][0]]["moyenne_1_".$num_disc."_".$num_periode] = 0 ;
               $bulletin [$notes_app [$num_eleve][0]]["nombre_1_".$num_disc."_".$num_periode] = 0 ;
              }
            }
           For ($num_eleve = 1 ; $num_eleve <= $notes_app [0][0] ; $num_eleve++)
            {
             $id_eleve = $notes_app [$num_eleve][0] ;
             $bulletin [$id_eleve]["appreciation_1_".$num_disc_tempo."_".$num_periode] = "" ;
             For ($num_colonne = 1 ; $num_colonne <= $nombre_colonnes_appreciations ; $num_colonne++)
              {
               $bulletin [$id_eleve]["appreciation_1_".$num_disc_tempo."_".$num_periode] .= $notes_app [$num_eleve][3+$num_colonne] ;
              }
             $bulletin [$id_eleve]["appreciation_1_".$num_disc_tempo."_".$num_periode] = conversion_texte ($bulletin [$id_eleve]["appreciation_1_".$num_disc_tempo."_".$num_periode]) ;

             // Calcul de la moyenne des disciplines si identiques
             $bulletin [$id_eleve]["moyenne_1_".$num_disc_tempo."_".$num_periode] += $notes_app [$num_eleve][2] ; //arrondi_note ($notes_app [$num_eleve][2], APB_MODE_ARRONDI_NOTE) ;
             $bulletin [$id_eleve]["nombre_1_".$num_disc_tempo."_".$num_periode]++ ;

             $bulletin [$id_eleve]["code_service_notation_1_".$num_disc_tempo."_".$num_periode] = $code_sn ;
             $bulletin [$id_eleve]["appreciation_generale_".$num_periode] = conversion_texte (appreciation_equipe_pedagogique ($id_eleve, $id_classe, $num_periode)) ;
            }
           If ($fusion_ok == 0)
            {
             // Calcul du rang de chaque eleve
             // Initialisation
             For ($num_el = 1 ; $num_el <= $notes_app [0][0] ; $num_el++)
              {
               $notes_app [$num_el][4+$notes_app [$num_el][3]] = -1 ;
              }
             $note_mini = 0 ;
             For ($rang = 1 ; $rang <= $notes_app [0][0] ; $rang++)
              {
               // Recherche de la plus petite note
               $num_el = 1 ;
               While (($notes_app [$num_el][4+$notes_app [$num_el][3]] != -1) And ($num_el <= $notes_app [0][0]))
                {
                 $num_el++ ;
                }
               $pos_plus_grand = $num_el ;
               $plus_grand = $notes_app [$pos_plus_grand][2] ;
               For ($kk = $num_el+1 ; $kk <= $notes_app [0][0] ; $kk++)
                {
                 If (($notes_app [$kk][4+$notes_app [$kk][3]] == -1) And ($notes_app [$kk][2] > $plus_grand))
                  {
                   $pos_plus_grand = $kk ;
                   $plus_grand = $notes_app [$pos_plus_grand][2] ;
                  }
                }
               // Affectation du rang
               $notes_app [$pos_plus_grand][4+$notes_app [$pos_plus_grand][3]] = $rang ;
              }
             // Affectation du rang pour bulletin
             For ($num_el = 1 ; $num_el <= $notes_app [0][0] ; $num_el++)
              {
               $bulletin [$notes_app [$num_el][0]]["rang_1_".$num_disc."_".$num_periode] = $notes_app [$num_el][4+$notes_app [$num_el][3]] ;
              }
             // Coefficient
             $bulletin [$notes_app [$num_el][0]]["coefficient_1_".$num_disc."_".$num_periode] = $discipline [10] ;
             // Ajout des notes
             For ($num_el = 1 ; $num_el <= $notes_app [0][0] ; $num_el++)
              {
               // Modalite d'une discipline (S,O,F,N)
               $bulletin [$notes_app [$num_el][0]]["modalite_election_1_".$num_disc."_".$num_periode] = garennes_apb_modalite_discipline ($mef_eleve [$num_el], $discipline [4]) ;
               // Etat de la note (S,D,N)
               Switch ($notes_app [$num_el][2])
                {
                 Case $code_absent         : $etat = "N" ; Break ;
                 Case $code_dispense       : $etat = "D" ; Break ;
                 Case $code_non_rendu      : $etat = "N" ; Break ;
                 Case $code_aucune_note    : $etat = "N" ; Break ;
                 Case $code_pas_discipline : $etat = "N" ; Break ;
                                   Default : $etat = "S" ; Break ;
                }
               $bulletin [$notes_app [$num_el][0]]["etat_1_".$num_disc."_".$num_periode] = $etat ;
              }
            }
          }
        }
      }
     Else
      {
       // Structure sauvegardee : On recherche directement sur la bdd SQL
       $requete = "SELECT FROM apb_annee_scolaire WHERE id_apb_classe='".(-$id_classe)."'" ;

      }
    }

   // Calcul moyenne
   For ($num_eleve = 1 ; $num_eleve <= $table_eleves [0][0] ; $num_eleve++)
    {
     $id_eleve = $table_eleves [$num_eleve]["eleve"]["id_eleve"] ;
     For ($num_annee = 1 ; $num_annee <= $table_eleves [$num_eleve]["eleve"]["annees_scolaires"] ; $num_annee++)
      {
       $id_classe = $table_eleves [$num_eleve]["annee_scolaire_".$num_annee]["id_classe"] ;
       For ($num_periode = $num_periode_debut ; $num_periode <= $num_periode_fin ; $num_periode++)
        {
         For ($num_disc = 1 ; $num_disc <= $nombre_services [$id_classe] ; $num_disc++)
          {
           $bulletin [$id_eleve]["moyenne_1_".$num_disc."_".$num_periode] = arrondi_note ($bulletin [$id_eleve]["moyenne_1_".$num_disc."_".$num_periode]/$bulletin [$id_eleve]["nombre_1_".$num_disc."_".$num_periode], APB_MODE_ARRONDI_NOTE) ;
          }
        }
      }
    }
      ===============================================================================================================================
   */


   // =====================================================
   // ==================================== NOUVELLE VERSION
   // Structure pedagogique de la classe
   UnSet ($code_service_notation) ;
   $table_enseignants [0][0] = $codes_enseignants [0] = 0 ;
   $table_matieres [0][0] = $codes_matieres [0] = 0 ;
   $table_service_notation [0][0] = $code_service_notation [0][0] = 0 ;
   $table_disc [0][0] = 0 ;
   UnSet ($nombre_services) ;
   // Table de toutes les valeurs en vrac
   // [0][0][0][0] = Nbr de classe
   // [0][0][0][num_classe] = id classe numero num_classe
   //
   // [num_classe]["disciplines"][0][0] = nbr de disciplines
   // [num_classe]["disciplines"][num_disc][0] = id_discipline
   // [num_classe]["disciplines"][num_disc][1] = code_sconet
   // [num_classe]["disciplines"][num_disc][2] = libelle_sconet
   // [num_classe]["disciplines"][num_disc][3] = libelle (nom matiere) a prendre dans 'modalites'
   //
   // [num_classe]["enseignants"][0][0] = nbr d'enseignants
   // [num_classe]["enseignants"][num_ens][0] = id_prof
   // [num_classe]["enseignants"][num_ens][1] = nom
   // [num_classe]["enseignants"][num_ens][2] = prenom
   //
   $table_generale [0][0] = 0 ;
   Switch ($numero_export)
    {
     Default :
      Case 1 : $num_periode_debut = 1 ;
               $num_periode_fin = 1 ;
               Break ;
      Case 2 : $num_periode_debut = 2 ;
               $num_periode_fin = 2 ;
               Break ;
    }
   //echo "Periodes=".$num_periode_debut."-".$num_periode_fin."<br>" ;
   For ($num_classe = 1 ; $num_classe <= $table_classes [0][0] ; $num_classe++)
    {
     $id_classe = $table_classes [$num_classe]["id_classe"] ;
     $effectif_classe = effectif ($id_classe) ;
     If ($id_classe > 0)
      {
       // Structure de la classe courante
       $structure = structure_pedagogique ($id_classe, -2, $millesime) ;
       $nombre_services [$id_classe] = SQL_nbr_lignes ($structure) ;
       For ($num_disc = 1 ; $num_disc <= $nombre_services [$id_classe] ; $num_disc++)
        {
         $discipline = SQL_ligne_suivante ($structure) ;

         // ==== Traitement matiere ====
         $matiere_modalites = garennes_apb_modalites ($discipline [4], $discipline [1]) ;
         If (Is_Array ($matiere_modalites))
          {
           $code_matiere = APB_ENTETE_MATIERE.$millesime."-".$matiere_modalites [0] ;
           If ($discipline [14] != 0) { $nom_groupe = nom_groupe_parid ($discipline [14]) ; $effectif = effectif_groupe ($discipline [14]) ; }
           Else { $nom_groupe = "" ; $effectif = $effectif_classe ; }
           // Enregistrement matiere
           If (!Array_Key_Exists ($discipline [4], $codes_matieres))
            {
             $codes_matieres [0]++ ;
             $codes_matieres [$discipline [4]] = $code_matiere ;

             $table_matieres [0][0]++ ;
             $table_matieres [$table_matieres [0][0]]["code"] = $code_matiere ;
             $table_matieres [$table_matieres [0][0]]["libelle_sconet"] = $discipline [1] ;
             $table_matieres [$table_matieres [0][0]]["libelle"] = $matiere_modalites [3] ;
             $table_matieres [$table_matieres [0][0]]["code_sconet"] = $discipline [4] ;
             // Nom du Groupe
             //$table_matieres [$table_matieres [0][0]]["nom_groupe"] = $nom_groupe ;
             //echo "Matiere ".$table_matieres [0][0]."->".$code_matiere.";".$discipline [1].";".$matiere_modalites [3].";".$discipline [4].";".$nom_groupe."<br>" ;
            }
           Else { $code_matiere = $codes_matieres [$discipline [4]] ; }

           // Discipline deja dans la classe ?
           $fusion_disc = dans_table_double ($id_classe, $discipline [4], $table_disc) ;
           $fusion_note = 0 ;
           If ($fusion_disc == 0)
            {
             $table_disc [0][0]++ ;
             $table_disc [$table_disc [0][0]][0] = $id_classe ;
             $table_disc [$table_disc [0][0]][1] = $discipline [4] ;
             $table_disc [$table_disc [0][0]][2] = $num_disc ;
             $table_disc [$table_disc [0][0]][3] = $discipline [13] ;
             $id_service_prof = $discipline [13] ;
             //echo "Discipline ".$table_disc [0][0]."->".$id_classe."->code=".$discipline [4].";num_disc=".$num_disc."<br>" ;
            }
           Else
            {
             If ($nom_groupe == "") { $id_service_prof = $table_disc [$fusion_disc][3] ; $fusion_note = 1 ; }
             Else { $id_service_prof = $discipline [13] ; }
             //echo "<b>Discipline ".$fusion_disc."(N&A=".$fusion_note.")->".$id_classe."->id_disc=".$discipline [0].";id_mod=".$matiere_modalites [0].";code=".$discipline [4].";num=".$num_disc.";nom_groupe=".$nom_groupe.";id_sp=".$id_service_prof."</b><br>" ;
            }

           // ==== Traitement Service notation ====
           For ($num_periode = $num_periode_debut ; $num_periode <= $num_periode_fin ; $num_periode++)
            {
             // ENTETEmillesime-id_classe-id_service_prof-num_periode
             $code_sn = APB_ENTETE_SERVICE_NOTATION.$millesime."-".$id_classe."-".$id_service_prof."-".$num_periode ;
             $num_code_sn = dans_table_double ($code_sn, $millesime+1, $code_service_notation) ;
             //echo "code_sn=".$code_sn."->".$num_code_sn."<br>" ;
             If ($num_code_sn == 0)
              {
               // ==== Traitement enseignant ====
               $prof = caracteristiques_utilisateur ($discipline [11]) ; // Obtient l'enseignant principal de la discipline
               $code_enseignant = APB_ENTETE_PROF.$millesime."-".$prof [0] ;
               $ens = dans_table ($code_enseignant, $codes_enseignants) ;
               If ($ens == 0)
                {
                 $codes_enseignants [0]++ ;
                 $codes_enseignants [$codes_enseignants [0]] = $code_enseignant ;

                 $table_enseignants [0][0]++ ;
                 $table_enseignants [$table_enseignants [0][0]]["code"] = $code_enseignant ;
                 $table_enseignants [$table_enseignants [0][0]]["nom"] = $prof [2] ;
                 $table_enseignants [$table_enseignants [0][0]]["prenom"] = $prof [3] ;
                 //echo "Enseignant ".$table_enseignants [0][0]."->".$code_enseignant.";".$prof [2].";".$prof [3]."<br>" ;
                }
               Else
                {
                 //echo "Utilise enseignant ".$ens."<br>" ;
                }

               $code_service_notation [0][0]++ ;
               $code_service_notation [$code_service_notation [0][0]][0] = $code_sn ;
               $code_service_notation [$code_service_notation [0][0]][1] = $millesime+1 ;
               //echo $code_service_notation [0][0]."|" ;

               $table_service_notation [0][0]++ ;
               $code_service_notation [$code_service_notation [0][0]][2] = $table_service_notation [0][0] ;

               $table_service_notation [$table_service_notation [0][0]]["code"] = $code_sn ;
               $table_service_notation [$table_service_notation [0][0]]["annee"] = $millesime+1 ; // +1 ?????????
               $table_service_notation [$table_service_notation [0][0]]["trimestre"] = $num_periode ;
               $table_service_notation [$table_service_notation [0][0]]["code_enseignant"] = $code_enseignant ;
               $table_service_notation [$table_service_notation [0][0]]["code_matiere"] = $code_matiere ;
               $table_service_notation [$table_service_notation [0][0]]["nom_groupe"] = $nom_groupe ;
               $table_service_notation [$table_service_notation [0][0]]["fusion"] = 0 ; // Nombre de fusion de discipline
               $table_service_notation [$table_service_notation [0][0]]["nom_matiere_0"] = $discipline [2] ; // Enregistrement du nom court pour fusion eventuelle
               //echo "Service ".$table_service_notation [0][0]."->".$code_sn.";".($millesime+1).";".$num_periode.";".$code_enseignant.";".$code_matiere.";".$nom_groupe."<br>" ;

               $moy_classe = stats_disc ($id_classe, $discipline [0], $num_periode, $discipline [9], $discipline [13], $millesime) ;
               $table_service_notation [$table_service_notation [0][0]]["moyenne_classe"] = $moy_classe ["moy"] ;
               $table_service_notation [$table_service_notation [0][0]]["moyenne_haute"] = $moy_classe ["max"] ;
               $table_service_notation [$table_service_notation [0][0]]["moyenne_basse"] = $moy_classe ["min"] ;
               $table_service_notation [$table_service_notation [0][0]]["effectif"] = $effectif ;
               //echo "Moyenne ->moy=".$moy_classe ["moy"].";max=".$moy_classe ["max"].";min=".$moy_classe ["min"].";eff=".$effectif."<br>" ;

               $num_disc_tempo = $num_disc ;
              }
             ElseIf ($fusion_disc > 0)
              {
               $moy_classe = stats_disc ($id_classe, $discipline [0], $num_periode, $discipline [9], $discipline [13], $millesime) ;
               $s = $table_service_notation [$num_code_sn]["moyenne_classe"]*$table_service_notation [$num_code_sn]["effectif"] ;
               //echo "<b>Utilise Service ".$num_code_sn."<br>" ;
               //echo " Moyenne ->moy=".$moy_classe ["moy"].";max=".$moy_classe ["max"].";min=".$moy_classe ["min"].";eff=".$effectif."<br>" ;
               //echo " moy*eff=".$s.";" ;
               $s += $moy_classe ["moy"]*$effectif ;
               //echo "nouv_moy*eff=".$s.";eff=".$table_service_notation [$num_code_sn]["effectif"].";" ;
               If ($discipline [14] != 0) { $table_service_notation [$num_code_sn]["effectif"] += $effectif ; $coeff = 1 ; } Else { $coeff = 2 ; }
               $table_service_notation [$num_code_sn]["moyenne_classe"] = $s/($table_service_notation [$num_code_sn]["effectif"]*$coeff) ;
               If ($table_service_notation [$num_code_sn]["moyenne_haute"] < $moy_classe ["max"]) { $table_service_notation [$num_code_sn]["moyenne_haute"] = $moy_classe ["max"] ; }
               If ($table_service_notation [$num_code_sn]["moyenne_basse"] > $moy_classe ["min"]) { $table_service_notation [$num_code_sn]["moyenne_basse"] = $moy_classe ["min"] ; }
               //echo "nouv_eff=".$table_service_notation [$num_code_sn]["effectif"].";coeff=".$coeff.";" ;
               //echo "nouv_moy=".$table_service_notation [$num_code_sn]["moyenne_classe"].";" ;
               //echo "nouv max=".$table_service_notation [$num_code_sn]["moyenne_haute"].";nouv_min=".$table_service_notation [$num_code_sn]["moyenne_basse"]."</b><br>" ;

               $num_disc_tempo = $table_disc [$fusion_disc][2] ;
              }
             // Traitement des notes/appreciations par classe
             $notes_app = caracteristiques_discipline ($id_classe, $num_periode, $discipline [0], $discipline [13], $discipline [9], $discipline [11], $nombre_colonnes_appreciations, $millesime) ;
             // Initialisation
             If ($fusion_note == 0)
              {
               For ($num_eleve = 1 ; $num_eleve <= $notes_app [0][0] ; $num_eleve++)
                {
                 $id_eleve = $notes_app [$num_eleve][0] ;
                 $bulletin [$id_eleve]["somme_1_".$num_disc_tempo."_".$num_periode] = $bulletin [$id_eleve]["nombre_1_".$num_disc_tempo."_".$num_periode] = 0 ;
                }
              }
             // Entete pour appreciations
             If ($fusion_note == 1)
              {
               // On a une fusion des appreciations
               If ($table_service_notation [$num_code_sn]["fusion"] == 0) { $entete = $table_service_notation [$num_code_sn]["nom_matiere_0"].":" ; }
               Else { $entete = ""; }
               $table_service_notation [$num_code_sn]["fusion"]++ ;
              }
             // Parcourt les eleves
             For ($num_eleve = 1 ; $num_eleve <= $notes_app [0][0] ; $num_eleve++)
              {
               $id_eleve = $notes_app [$num_eleve][0] ;
               // Fusion des appreciations multicolonnes
               $chaine = "" ;
               For ($num_colonne = 1 ; $num_colonne <= $nombre_colonnes_appreciations ; $num_colonne++)
                {
                 $chaine .= $notes_app [$num_eleve][3+$num_colonne] ;
                }
               // Recherche le coefficient a appliquer pour cette discipline
               $coeff_note = 1 ;
               // Service notation associee a la note
               If ($fusion_note == 1)
                {
                 $appreciation_eleve = $entete.$bulletin [$id_eleve]["appreciation_1_".$num_disc_tempo."_".$num_periode].conversion_texte ("\n".$discipline [2].":".$chaine) ;
                }
               Else
                {
                 $appreciation_eleve = conversion_texte ($chaine) ;
                 // Modalite d'une discipline (S,O,F,N)
                 $bulletin [$id_eleve]["modalite_election_1_".$num_disc_tempo."_".$num_periode] = garennes_apb_modalite_discipline ($mef_eleve [$num_eleve], $discipline [4]) ;
                 // Etat de la note (S,D,N)
                 Switch ($notes_app [$num_eleve][2])
                  {
                   Case $code_absent         : $etat = "N" ; Break ;
                   Case $code_dispense       : $etat = "D" ; Break ;
                   Case $code_non_rendu      : $etat = "N" ; Break ;
                   Case $code_aucune_note    : $etat = "N" ; Break ;
                   Case $code_pas_discipline : $etat = "N" ; Break ;
                                     Default : $etat = "S" ; Break ;
                  }
                 $bulletin [$id_eleve]["etat_1_".$num_disc_tempo."_".$num_periode] = $etat ;
                }
               $bulletin [$id_eleve]["appreciation_1_".$num_disc_tempo."_".$num_periode] = $appreciation_eleve ;
               // Identification du service notation
               $bulletin [$id_eleve]["num_service_notation_1_".$num_disc_tempo."_".$num_periode] = $num_code_sn ;
               $bulletin [$id_eleve]["code_service_notation_1_".$num_disc_tempo."_".$num_periode] = $code_sn ;
               // Calcul de la somme des notes
               $bulletin [$id_eleve]["somme_1_".$num_disc_tempo."_".$num_periode] += $notes_app [$num_eleve][2]*$coeff_note ; //arrondi_note ($notes_app [$num_eleve][2], APB_MODE_ARRONDI_NOTE) ;
               $bulletin [$id_eleve]["nombre_1_".$num_disc_tempo."_".$num_periode]++ ;

               //echo "Eleve ".$id_eleve."->APP1_".$num_disc_tempo."_".$num_periode."=".$bulletin [$id_eleve]["appreciation_1_".$num_disc_tempo."_".$num_periode] ;
               //echo ";num_serv_not=".$bulletin [$id_eleve]["num_service_notation_1_".$num_disc_tempo."_".$num_periode] ;
               //echo ";code_serv_not=".$bulletin [$id_eleve]["code_service_notation_1_".$num_disc_tempo."_".$num_periode] ;
               //echo ";somme=".$bulletin [$id_eleve]["somme_1_".$num_disc_tempo."_".$num_periode] ;
               //echo ";nombre=".$bulletin [$id_eleve]["nombre_1_".$num_disc_tempo."_".$num_periode]."<br>" ;
               // Appreciation generale
               //$bulletin [$id_eleve]["appreciation_generale_".$num_periode] = conversion_texte (appreciation_equipe_pedagogique ($id_eleve, $id_classe, $num_periode)) ;
              }
             
            }
           
           //echo "<hr>" ;
          }
        }
       // Appreciation generale par eleve pour une classe
       //echo "Classe ".$id_classe."<br>" ;
       For ($num_eleve = 1 ; $num_eleve <= $notes_app [0][0] ; $num_eleve++)
        {
         $id_eleve = $notes_app [$num_eleve][0] ;
         For ($num_periode = $num_periode_debut ; $num_periode <= $num_periode_fin ; $num_periode++)
          {
           $chaine = appreciation_equipe_pedagogique ($id_eleve, $id_classe, $num_periode) ;
           If ($chaine != "") { $bulletin [$id_eleve]["appreciation_generale_".$num_periode] = conversion_texte ($chaine) ; }
           Else { $bulletin [$id_eleve]["appreciation_generale_".$num_periode] = "" ; }
           //echo "APP GEN ".$id_eleve."_".$num_periode."=".$bulletin [$id_eleve]["appreciation_generale_".$num_periode]."<br>" ;
          }
        }
      }
    }

   // Calcul moyennes
   For ($num_eleve = 1 ; $num_eleve <= $table_eleves [0][0] ; $num_eleve++)
    {
     $id_eleve = $table_eleves [$num_eleve]["eleve"]["id_eleve"] ;
     For ($num_annee = 1 ; $num_annee <= $table_eleves [$num_eleve]["eleve"]["annees_scolaires"] ; $num_annee++)
      {
       $id_classe = $table_eleves [$num_eleve]["annee_scolaire_".$num_annee]["id_classe"] ;
       For ($num_periode = $num_periode_debut ; $num_periode <= $num_periode_fin ; $num_periode++)
        {
         For ($num_disc = 1 ; $num_disc <= $nombre_services [$id_classe] ; $num_disc++)
          {
           If ($bulletin [$id_eleve]["nombre_".$num_annee."_".$num_disc."_".$num_periode] != 0)
            {
             $bulletin [$id_eleve]["moyenne_".$num_annee."_".$num_disc."_".$num_periode] = arrondi_note ($bulletin [$id_eleve]["somme_".$num_annee."_".$num_disc."_".$num_periode]/$bulletin [$id_eleve]["nombre_".$num_annee."_".$num_disc."_".$num_periode], APB_MODE_ARRONDI_NOTE) ;
            }
           Else
            {
             $bulletin [$id_eleve]["moyenne_".$num_annee."_".$num_disc."_".$num_periode] = "" ;
            }
          }
        }
      }
    }

   // Calcul du rang de chaque eleve
   For ($num_classe = 1 ; $num_classe <= $table_classes [0][0] ; $num_classe++)
    {
   //For ($num_eleve = 1 ; $num_eleve <= $table_eleves [0][0] ; $num_eleve++)
     //$id_eleve = $table_eleves [$num_eleve]["eleve"]["id_eleve"] ;
     $id_classe = $table_classes [$num_classe]["id_classe"] ;
     For ($num_annee = 1 ; $num_annee <= $table_eleves [$num_eleve]["eleve"]["annees_scolaires"] ; $num_annee++)
      {
       $id_classe = $table_eleves [$num_eleve]["annee_scolaire_".$num_annee]["id_classe"] ;
       For ($num_periode = $num_periode_debut ; $num_periode <= $num_periode_fin ; $num_periode++)
        {
         For ($num_disc = 1 ; $num_disc <= $nombre_services [$id_classe] ; $num_disc++)
          {
          }
        }
      }
    }

 // Initialisation
 For ($num_eleve = 1 ; $num_eleve <= $notes_app [0][0] ; $num_eleve++)
  {
   $notes_app [$num_eleve][4+$notes_app [$num_eleve][3]] = -1 ;
  }
 $note_mini = 0 ;
 For ($rang = 1 ; $rang <= $notes_app [0][0] ; $rang++)
  {
   // Recherche de la plus petite note
   $num_eleve = 1 ;
   While (($notes_app [$num_eleve][4+$notes_app [$num_el][3]] != -1) And ($num_el <= $notes_app [0][0]))
    {
     $num_el++ ;
    }
   $pos_plus_grand = $num_el ;
   $plus_grand = $notes_app [$pos_plus_grand][2] ;
   For ($kk = $num_el+1 ; $kk <= $notes_app [0][0] ; $kk++)
    {
     If (($notes_app [$kk][4+$notes_app [$kk][3]] == -1) And ($notes_app [$kk][2] > $plus_grand))
      {
       $pos_plus_grand = $kk ;
       $plus_grand = $notes_app [$pos_plus_grand][2] ;
      }
    }
   // Affectation du rang
   $notes_app [$pos_plus_grand][4+$notes_app [$pos_plus_grand][3]] = $rang ;
  }
 // Affectation du rang pour bulletin
 For ($num_el = 1 ; $num_el <= $notes_app [0][0] ; $num_el++)
  {
   $bulletin [$notes_app [$num_el][0]]["rang_1_".$num_disc."_".$num_periode] = $notes_app [$num_el][4+$notes_app [$num_el][3]] ;
  }

   // Entete XML
   $chaine  = "<?xml version=\"".APB_VERSION_XML."\" encoding=\"".APB_ENCODAGE_XML."\"?>".$ligne ;
   $chaine .= "<fichier logiciel=\"".APB_NOM_LOGICIEL."\" version=\"".APB_VERSION."\" date-creation=\"".Date ("Y-m-d")."\">".$ligne ;

   // Creation structure etablissement
   $chaine .= "<etablissement rne=\"".$table_etablissement ["rne"]."\" nom=\"".$table_etablissement ["nom"]."\" cp=\"".$table_etablissement ["cp"]."\">".$ligne ;

   // Creation structure des classes
   $chaine .= "<classes>".$ligne ;
   For ($num_classe = 1 ; $num_classe <= $table_classes [0][0] ; $num_classe++)
    {
     $chaine .= "<classe code=\"".$table_classes [$num_classe]["code_classe"]."\" annee=\"".$table_classes [$num_classe]["annee"]."\" " ;
     $chaine .= "nom=\"".$table_classes [$num_classe]["nom"]."\" niveau=\"".$table_classes [$num_classe]["niveau"]."\" " ;
     $chaine .= "professeur-principal=\"".$table_classes [$num_classe]["code_prof_princ"]."\" decoupage=\"".$table_classes [$num_classe]["decoupage"]."\"/>".$ligne ;
    }
   $chaine .= "</classes>".$ligne ;

   // Creation structure des services-notations
   $chaine .= "<services-notations>".$ligne ;
   For ($num_sn = 1 ; $num_sn <= $table_service_notation [0][0] ; $num_sn++)
    {
     $chaine .= "<service-notation code=\"".$table_service_notation [$num_sn]["code"]."\" " ;
     $chaine .= "annee=\"".$table_service_notation [$num_sn]["annee"]."\" " ;
     $chaine .= "trimestre=\"".$table_service_notation [$num_sn]["trimestre"]."\" " ;
     $chaine .= "code-enseignant=\"".$table_service_notation [$num_sn]["code_enseignant"]."\" " ;
     $chaine .= "code-matiere=\"".$table_service_notation [$num_sn]["code_matiere"]."\"" ;
     If ($table_service_notation [$num_sn]["nom_groupe"] != "") { $chaine .= " nom-groupe=\"".$table_service_notation [$num_sn]["nom_groupe"]."\"" ; }
     //$chaine .= " id-structure-sconet=\"".$table_service_notation [$num_sn]["id_structure_sconet"]."\"" ;
     $chaine .= ">".$ligne ;
     If ($table_service_notation [$num_sn]["moyenne_classe"] != $code_aucune_note)
      {
       $chaine .= "<moyenne-classe>".arrondi_note ($table_service_notation [$num_sn]["moyenne_classe"], APB_MODE_ARRONDI_NOTE)."</moyenne-classe>".$ligne ;
       $chaine .= "<moyenne-haute>".arrondi_note ($table_service_notation [$num_sn]["moyenne_haute"], APB_MODE_ARRONDI_NOTE)."</moyenne-haute>".$ligne ;
       $chaine .= "<moyenne-basse>".arrondi_note ($table_service_notation [$num_sn]["moyenne_basse"], APB_MODE_ARRONDI_NOTE)."</moyenne-basse>".$ligne ;
      }
     Else
      {
       $chaine .= "<moyenne-classe></moyenne-classe>".$ligne ;
       $chaine .= "<moyenne-haute></moyenne-haute>".$ligne ;
       $chaine .= "<moyenne-basse></moyenne-basse>".$ligne ;
      }
     $chaine .= "<effectif>".$table_service_notation [$num_sn]["effectif"]."</effectif>".$ligne ;
     $chaine .= "</service-notation>".$ligne ;
    }
   // Service appreciation generale
   For ($num_classe = 1 ; $num_classe <= $table_classes [0][0] ; $num_classe++)
    {
     For ($num_periode = $num_periode_debut ; $num_periode <= $num_periode_fin ; $num_periode++)
      {
       $chaine .= "<service-notation code=\"".APB_ENTETE_SERVICE_NOTATION.$table_classes [$num_classe]["classe"]."-".$num_periode."\" " ;
       $chaine .= "annee=\"".$table_classes [$num_classe]["annee"]."\" " ;
       $chaine .= "trimestre=\"".$num_periode."\" code-matiere=\"MOYGEN\" code-enseignant=\"".$table_classes [$num_classe]["code_prof_princ"]."\">".$ligne ;
       $chaine .= "<moyenne-classe></moyenne-classe>".$ligne ;
       $chaine .= "<moyenne-haute></moyenne-haute>".$ligne ;
       $chaine .= "<moyenne-basse></moyenne-basse>".$ligne ;
       $chaine .= "<effectif></effectif>".$ligne ;
       $chaine .= "</service-notation>".$ligne ;
      }
    }
   $chaine .= "</services-notations>".$ligne ;

   // Creation structure des matieres
   $chaine .= "<matieres>".$ligne ;
   For ($num_matiere = 1 ; $num_matiere <= $table_matieres [0][0] ; $num_matiere++)
    {
     $chaine .= "<matiere code=\"".$table_matieres [$num_matiere]["code"]."\" libelle-sconet=\"".$table_matieres [$num_matiere]["libelle_sconet"]."\" " ;
     $chaine .= "libelle=\"".garennes_apb_filtrage_espace ($table_matieres [$num_matiere]["libelle"])."\" code-sconet=\"".$table_matieres [$num_matiere]["code_sconet"]."\"/>".$ligne ;
    }
   // Matiere appreciation generale
   $chaine .= "<matiere code=\"MOYGEN\" libelle-sconet=\"\" libelle=\"Appr".Chr (233)."ciation g".Chr (233)."n".Chr (233)."rale"."\" code-sconet=\"0\"/>".$ligne ;
   $chaine .= "</matieres>".$ligne ;

   // Creation structure des enseignants
   $chaine .= "<enseignants>".$ligne ;
   For ($num_enseignant = 1 ; $num_enseignant <= $table_enseignants [0][0] ; $num_enseignant++)
    {
     $chaine .= "<enseignant code=\"".$table_enseignants [$num_enseignant]["code"]."\" " ;
     $chaine .= "nom=\"".$table_enseignants [$num_enseignant]["nom"]."\" prenom=\"".$table_enseignants [$num_enseignant]["prenom"]."\"/>".$ligne ;
    }
   $chaine .= "</enseignants>".$ligne ;

   // Creation structure des eleves
   $chaine .= "<eleves>".$ligne ;
   For ($num_eleve = 1 ; $num_eleve <= $table_eleves [0][0] ; $num_eleve++)
    {
     $id_eleve = $table_eleves [$num_eleve]["eleve"]["id_eleve"] ;
     $chaine .= "<eleve code=\"".$table_eleves [$num_eleve]["eleve"]["code"]."\" ine=\"".$table_eleves [$num_eleve]["eleve"]["ine"]."\" " ;
     $chaine .= "nom=\"".$table_eleves [$num_eleve]["eleve"]["nom"]."\" prenom=\"".$table_eleves [$num_eleve]["eleve"]["prenom"]."\" " ;
     $chaine .= "date-naissance=\"".$table_eleves [$num_eleve]["eleve"]["date_naissance"]."\">".$ligne ;

     // Creation de la sous-structure des annees scolaires
     $chaine .= "<annees-scolaires>".$ligne ;
     For ($num_annee = 1 ; $num_annee <= $table_eleves [$num_eleve]["eleve"]["annees_scolaires"] ; $num_annee++)
      {
       $id_classe = $table_eleves [$num_eleve]["annee_scolaire_".$num_annee]["id_classe"] ;
       $chaine .= "<annee-scolaire annee=\"".$table_eleves [$num_eleve]["annee_scolaire_".$num_annee]["annee"]."\" " ;
       $chaine .= "code-classe=\"".$table_eleves [$num_eleve]["annee_scolaire_".$num_annee]["code_classe"]."\" " ;
       $chaine .= "code-mef=\"".$table_eleves [$num_eleve]["annee_scolaire_".$num_annee]["code_mef"]."\" " ;
       $chaine .= "libelle-mef=\"".$table_eleves [$num_eleve]["annee_scolaire_".$num_annee]["libelle_mef"]."\">".$ligne ;

       // Creation de la sous-structure bulletins
       $chaine .= "<bulletins>".$ligne ;
       For ($num_periode = $num_periode_debut ; $num_periode <= $num_periode_fin ; $num_periode++)
        {
         $chaine .= "<bulletin trimestre=\"".$num_periode."\">".$ligne ;
         For ($num_disc = 1 ; $num_disc <= $nombre_services [$id_classe] ; $num_disc++)
          {
           //echo "\$bulletin [".$id_eleve."][\"code_service_notation_".$num_annee."_".$num_disc."_".$num_periode."\"]=".$bulletin [$id_eleve]["code_service_notation_".$num_annee."_".$num_disc."_".$num_periode]."<br>" ;
           If ($bulletin [$id_eleve]["code_service_notation_".$num_annee."_".$num_disc."_".$num_periode] != "")
            {
             $chaine .= "<notes code-service-notation=\"".$bulletin [$id_eleve]["code_service_notation_".$num_annee."_".$num_disc."_".$num_periode]."\" " ;
             If ($bulletin [$id_eleve]["etat_".$num_annee."_".$num_disc."_".$num_periode] != "") { $chaine .= "etat=\"".$bulletin [$id_eleve]["etat_".$num_annee."_".$num_disc."_".$num_periode]."\" " ; }
             $chaine .= "modalite-election=\"".$bulletin [$id_eleve]["modalite_election_".$num_annee."_".$num_disc."_".$num_periode]."\">".$ligne ;
             If (($bulletin [$id_eleve]["etat_".$num_annee."_".$num_disc."_".$num_periode] != "N") And ($bulletin [$id_eleve]["etat_".$num_annee."_".$num_disc."_".$num_periode] != "D"))
              {
               If (Is_Numeric ($bulletin [$id_eleve]["moyenne_".$num_annee."_".$num_disc."_".$num_periode]))
                { $chaine .= "<moyenne>".arrondi_note ($bulletin [$id_eleve]["moyenne_".$num_annee."_".$num_disc."_".$num_periode], APB_MODE_ARRONDI_NOTE)."</moyenne>".$ligne ; }
               If (Is_Numeric ($bulletin [$id_eleve]["rang_".$num_annee."_".$num_disc."_".$num_periode])) { $chaine .= "<rang>".$bulletin [$id_eleve]["rang_".$num_annee."_".$num_disc."_".$num_periode]."</rang>".$ligne ; }
              }
             If ($bulletin [$id_eleve]["appreciation_".$num_annee."_".$num_disc."_".$num_periode] != "") { $chaine .= "<appreciation>".$bulletin [$id_eleve]["appreciation_".$num_annee."_".$num_disc."_".$num_periode]."</appreciation>".$ligne ; }
             $chaine .= "</notes>".$ligne ;
            }
           //Else { $chaine .= "<notes code-service-notation=\"\" modalite-election=\"\"/>" ; }
          }
         // Appreciation equipe pedagogique
         //If ($bulletin [$id_eleve]["appreciation_generale_".$num_periode] != "")
         // {
           $chaine .= "<notes code-service-notation=\"".APB_ENTETE_SERVICE_NOTATION.$table_eleves [$num_eleve]["annee_scolaire_".$num_annee]["classe"]."-".$num_periode."\" " ;
           $chaine .= "modalite-election=\"".APB_MODALITE_MOYGEN."\">".$ligne ;
           $chaine .= "<moyenne></moyenne>".$ligne ;
           $chaine .= "<rang></rang>".$ligne ;
           $chaine .= "<appreciation>".$bulletin [$id_eleve]["appreciation_generale_".$num_periode]."</appreciation>".$ligne ;
           $chaine .= "</notes>".$ligne ;
         // }
         $chaine .= "</bulletin>".$ligne ;
        }
       $chaine .= "</bulletins>".$ligne ;

       $chaine .= "</annee-scolaire>".$ligne ;
      }
     $chaine .= "</annees-scolaires>".$ligne ;
     $chaine .= "</eleve>".$ligne ;
    }
   $chaine .= "</eleves>".$ligne ;
   $chaine .= "</etablissement>".$ligne ;
   $chaine .= "</fichier>".$ligne ;

   //echo "<pre>".Str_Replace ("<", "&lt;", $chaine)."</pre>" ;
   //Exit ;
   // Exportation
   Header ("Content-Type: text/xml") ;
   Header ("Content-Disposition: attachment; filename=".$table_etablissement ["rne"]."_E".$numero_export.".xml") ;
   Echo $chaine ;
  }
?>